Глава 22

Использование WML-страниц для разработки WAP-приложений

Если вы разработчик Web-сайтов, не исключено что в силу бурного развития мобильной связи в скором времени вам доведется задуматься над проектированием WAP-сайта. Но обо всем по порядку.

Если вам доводилось когда-либо просматривать каталоги современных мобильных телефонов, то вы наверняка обращали внимание на следующие фразы: "поддержка WAP" или "встроенный микробраузер с поддержкой технологии WAP". Эта фраза предполагает, что данный телефон позволит вам производить заказы на различные услуги, бронировать билеты или выполнять определенные операции, используя протокол беспроводных приложений -WAP (Wireless Application Protocol). Впрочем, у автора есть подозрение, что каждый второй читатель уже обладает подобным мобильным устройством.

За последнее время мы стали свидетелями возникновения и бурного развития мобильной связи. Сегодня многие корпорации провозглашают приоритетные направления в развитии и совершенствовании собственных технологий на базе информационной интеграции и технологической координации за счет существенного расширения специализированного информационно-организационного сервиса в Internet. При этом совершенно уникальные возможности для обеспечения истинной мобильности в управлении бизнесом открываются благодаря появлению протокола беспроводных приложений WAP и WAP-Internet-технологии.

Первой компанией, предложившей решения для беспроводного доступа к данным в Internet, явилась Unwired Planet, преобразовавшаяся в дальнейшем в компанию Phone.com. Уже в конце 1997 г. был организован WAP Forum, в состав которого вошли все ведущие производители беспроводных устройств, коммуникационного оборудования, операторы беспроводной связи и всех стандартов, а также производители программного и аппаратного обеспечения. WAP Forum, в свою очередь, разработал открытую WAP-специ-фикацию, предназначенную для стандартизации беспроводных протоколов, с помощью которых мобильные устройства получают доступ к различным услугам сети. В 1999 г. была принята наиболее распространенная версия спецификации WAP 1.1 и уже к третьему кварталу 2000 г. была принята спецификация версии 1.2, являющаяся дополнением к предыдущей версии.

Появление WAP расширяет возможности Internet, добавляя новую грань -мобильность. Уже сегодня существует целый ряд транспортных услуг с использованием WAP-технологий. Например, в Лондоне развит мобильный информационный участок, который собирает воедино информацию об услугах лондонского общественного транспорта для обеспечения легкого доступа к ней посредством мобильных телефонов. С помощью этой службы вы можете:

Однако продолжим. Имея общее представление о концепции сети Internet, нетрудно разобраться в технологии WAP, построенной по аналогии. В WAP, также как и Web, существуют понятия браузера, протокола, шлюза, сервера и языка описания передаваемых данных.

WAP-браузер встроен в беспроводные устройства (вспомните каталоги современных мобильных телефонов). Впрочем, на сегодняшний день существует достаточное количество так называемых эмуляторов WAP-браузера в виде программного обеспечения для компьютеров, в некоторой литературе их еще называют имитаторами WAP-браузера, но смысл при этом не меняется.

WAP-протокол использует технологию, очень схожую с применяемой для передачи данных по компьютерным сетям и в частности по Internet.

С точки зрения разработчика программного обеспечения клиентом является не само мобильное устройство, а программный компонент, называемый WAP-шлюзом, который преобразует запросы мобильного устройства в запросы HTTP и перенаправляет HTTP-ответы мобильному устройству через все тот же WAP-шлюз.

WAP-сервер — это, по сути, все тот же Web-сервер, требующий дополнительной конфигурации.

В силу ограничений на форматы и на объемы передаваемых данных для WAP в качестве языка описания передаваемых данных был разработан WML (Wireless Markup Language) — "диалект" HTML/XML. Аналогом же языка описания сценариев JavaScript для WAP является WMLScript, который позволяет программировать логику и получать доступ к некоторым функциям мобильных устройств. Дальше, больше!

Подготовка к работе

В первую очередь нам необходимо настроить HTTP-протокол для совместной работы с WAP-шлюзом и мобильными устройствами, поддерживающими технологию WAP. (Мы опишем подобную настройку для двух наиболее популярных серверов: Apache и Microsoft IIS.) Затем для удобства отладочного процесса необходимо установить один из эмуляторов WAP-браузера, о которых будет сказано несколько слов.

Конфигурация типов MIME для Web-сервера

Для конфигурации MIME-типов сервера Apache необходимо:

  1. Открыть файл mime.types. Полный путь месторасположения данного файла может быть следующим: C:\Apache\conf.
  2. Внести изменения в формате "MIME-тип/расширение", как показано ниже:

# MIME type Extension

text/vnd.wap.wml wml

image/vnd.wap.wbmp wbmp

application/vnd.wap.wmlc wmlc

text/vnd.wap.wmlscript wmls

application/vnd.wap.wmlscriptc wmlsc

  1. Сохранить этот файл и перезапустить сервер Apache.

Для конфигурации MIME-типов сервера Microsoft IIS необходимо:

  1. Запустить редактор реестра Regedit.exe.
  2. Открыть ключи реестра: HKEY_LOCAL_MACHINE\SYSTEM\

    CurrentControlSet\Services\InetInfo\ Parameters\MimeMap

  3. Добавить новые значения пар, описанные ниже (используйте для этого команду Edit | New | String Value (Правка | Создать Строковый параметр)):

Value name Value data

"text/vnd.wap.wml,wml" ".wml"

"image/vnd.wap.wbmp,wbmp" ".wbmp"

"application/vnd.wap.wmlc,wmlc" ".wmlc"

"text/vnd.wap.wmlscript,wmls" ".wmls"

"application/vnd.wap.wmlscriptc,wmlsc" ".wmlsc"

  1. После чего перезагрузить сервер Microsoft IIS.

Эмуляторы WAP-браузера

Пока WAP-страницы нельзя просматривать традиционными Web-браузерами, но может быть, недалек тот час, когда очередные версии

Microsoft Internet Explorer и Netscape Navigator предоставят такую возможность, а пока следует использовать специализированные программы.

Во-первых, эмуляторы WAP-браузера поставляются вместе со специализированными пакетами разработок WAP-сайтов, такими как:

Во-вторых, существуют отдельные эмуляторы WAP-браузера, например:

В-третьих, нельзя забывать Internet, где на обычном Web-сервере, например таком как по адресу http://www.gelon.net, можно выбрать любую доступную модель WAP-телефона и в открывшемся окне, представленном в виде образа телефона, нажимать кнопки этого телефона, используя компьютерную мышь, а с помощью клавиатуры вводить адреса WAP-сайтов, которые будут высвечиваться на дисплее виртуального сотового аппарата.

В связи с тем, что пакет ColdFusion Studio поддерживает язык разметки для беспроводных устройств — Wireless Markup Language (WML) и является самодостаточным в плане разработки WML-страниц, нам остается только установить один из эмуляторов WAP-браузера, чтобы просматривать результат выполнения WML-страниц на локальном сервере. Например, воспользуемся WAP-браузером Wireless Companion от компании YourWAP.com. На первом этапе этого будет достаточно.

Обзор языка WML

Как уже было отмечено, для WAP в качестве языка описания передаваемых данных был разработан WML (Wireless Markup Language), "диалект" HTML/XML. По этой причине для разработчиков Web-сайтов не составит особой сложности изучить основы языка WML.

Суть разработки WML-страницы сводится к формированию некоей колоды карт, где пользователь одновременно видит содержание одной карты (card), но при этом он может обращаться к другим картам из той же колоды (deck), не требуя взаимодействия с сервером, т. к. вместе с активной картой в память устройства загружается вся колода в виде WML-файла. Переход же по картам осуществляется с использованием определенного синтаксиса: #NameCard: Впрочем, пользователь может обращаться и к картам из других колод: NameFile.wml#NaneCard, но на это может уйти некоторое время, поскольку в этом случае устройство попытается обратиться к серверу для загрузки очередной колоды — WML-файла.

Примечание

Размер загружаемых в WAP-устройства файлов ограничен объемом порядка 1,4 Кбайт, максимальные границы могут варьироваться в зависимости от модели устройства.

В ColdFusion Studio существует возможность создать новый документ, используя шаблон документа WML. Для этого достаточно выбрать команду File | New (Файл Создать) и в открывшемся диалоговом окне New Document (Новый документ) на вкладке WML выбрать шаблон Static (Статический). После чего в основном окне редактирования откроется файл со следующим содержанием:

<?xml version="1.0"?>

<!DOCTYPE wml PUBLIC "-//PHONE.COM//DTD WML 1.1//EN"

"http://www.phone.com/dtd/wmlll.dtd"> <wml> <card>

</card> </wml>

Таким образом, у нас уже есть колода (deck) с одной картой (card) и необходимый для составления WML-страниц пролог. Пролог включает в себя ссылку на файл DTD (Data Type Definition), позволяющую определить структуру и состав используемого языка. Колода, как вы наверно заметили, задается парой тегов <wml> и </wml>, карта колоды, соответственно находящаяся внутри колоды, определяется парой тегов <card> и </card>. Внутри же самой карты вы можете определять ее содержание. Например:

<card>

<p>Text</p>

</card>

Заметим, что для форматирования текста могут использоваться теги, аналогичные HTML. Теги <еm> и <i> позволяют выделять текст курсивом. Тег <u> предназначен для подчеркивания текста. Теги <ь> и <strong> используются для выделения текста жирным шрифтом. Теги <big> и <small> позволяют увеличивать и уменьшать размер текста. Тег <brг/>, не имеющий пары, предназначен для разрыва строки. Тег же <tabie> позволяет выстраивать таблицы с уже привычными <tr> и <td>.

Использованный нами тег <р> определяет параграф. Более того, для параграфа можно задавать атрибут выравнивания текста align, принимающий значения: center (по центру), left (по левому краю) или right (по правому краю). Также для параграфа можно задавать способ переноса текста атрибутом mode, принимающим значения wrap (с автопереносом) или nowrap (без автопереноса).

Внимание

Использование больших букв в именах тегов и атрибутах этих тегов может приводить к возникновению ошибок.

В раздел колоды можно включать несколько карточек, при этом, вызывая WML-страницу, на экране устройства активизируется первая карта. Что бы осуществлять переход по карточкам, каждой карте необходимо указать идентификатор. Для этого существует атрибут id. Например:

<card id="Cruises" title="My-Line Cruises">

<p mode="wrap">

New York's <i>BEST</i><br/>

Sightseeing and Entertainment Cruises

</p>

</card>

В приведенном примере помимо идентификатора карты id также определен заголовок с помощью атрибута title, который позволяет отображать текст в верхней части экрана при активизации данной карты. И теперь, когда наша карта уже приняла допустимый вид, можно приступить к созданию других карт. Например, следующая колода представлена двумя картами cruises и Schedules, с возможностью перемещаться по этим картам, благодаря знакомому тегу <а>, позволяющему устанавливать ссылки как на карты внутри колоды, так и на карты других колод:

<?xml version="1.0"?>

<!DOCTYEE wml PUBLIC "-//PHONE. COM//DTD WML 1.1//EN"

"http: //www.phone.com/dtd/wmlll .dtd" > <wml>

<card id="Cruises" title="My-Line Cruises">

<p mode="wrap"> New York's <i>BEST</i><br/>

Sightseeing and Entertainment Cruises

<a href="#Schedules">Schedules</a><br/>

</p>

</card>

<card id=" Schedules" title="Schedules"> <p>

<u>Full Island Cruise</u><br/> <i>Oct.5-Nov.l (Mon.-Fri. )

</i><br/> 10:00 am<br/> 11:00 am<br/>

1:30 pm<br/>

2:30 pm<br/> <a href="#Cruises">Cruises</a><br/>

</p>

</card>

Тег <а> имеет укороченный синтаксис от тега <anchor>.

Далее поговорим об управлении ассоциативными программными кнопками с определенными командами. В мобильных устройствах достаточно часто используются левая и правая клавиши для выполнения тех или иных действий. Так вот, язык WML позволяет программировать данные действия. И здесь типовыми действиями являются:

Прежде чем продемонстрировать пример, отметим, что данные действия могут использоваться в качестве значения атрибута type тега <do>. Причем перечисленные действия могут быть определены как на уровне конкретной карты, так и на уровне всей колоды с использованием тега <tempiate>. Например, несколько видоизменим предыдущий пример:

<?xml version="1.0"?>

<!DOCTYPE wml PUBLIC "-//PHONE . COM//DTD WML 1.1//EN" "http: //www.phone.com/dtd/wmlll.dtd" >

<wrnl>

<template>

<do type="accept" name="Author" label="Author" optional="false">

<go href="#Author" sendreferer="false" method="get"/> </do>

<do type="prev" name="BACK" label="Back"

optional="false"><prev/></do> </template>

<card id="Cruises" title="My-Line Cruises ">

<do type="accept" name="List" label="List Cruises" optional="false">

<go href="ListCruises.wml#List" sendreferer="false" method="get"/> </do>

<p mode="wrap"> New York's <i>BEST</i><br/>

Sightseeing and Entertainment Cruises

<a href="#Schedules">Schedules</a><br/>

</card>

<card id="Schedules" title="Schedules">

<u>Full Island Cruise</u><br/> <i>Oct.5-Nov.l (Mon.-Fri. ) </i><br/> 10:00 am<br/> 11:00 am<br/>

1:30 pm<br/>

2:30 pm<br/> <a href="ICruises">Cruises</a><br/>

</p>

</card>

<card id="Author" title="Author">

</p>

<small>Ruben Akhayan</smallXbr/>

<a href="iCruises">Cruises</axbr/>

<a href="ISchedules">Schedules</a><br/>

</p>

</card>

</wml>

Отметим, что в приведенном примере перед определением карт мы установили действие prev, позволяющее, находясь на любой карте текущей колоды, возвращаться к предыдущей карте. Также в области определения действий для всех карт <tempiate> было определено действие перехода на карту Author, расположенную в этой же колоде. А вот уже непосредственно для карты Cruises было определено действие перехода на карту List другой колоды - Listcruises в виде загрузки файла ListCruises.wml.

Иногда возникает необходимость выполнить определенные действия по прошествии заданного интервала времени, начиная с определенного момента. На такой случай в WML предусмотрен элемент таймера timer. Элемент таймер "следит" за временем и по истечении заданного интервала времени генерирует событие ontimer. Например, перед загрузкой основной колоды на протяжении трех секунд продемонстрируем пользователю наш логотип, сформировав страницу под названием start.wml.

<?xml version="1.0"?>

<!DOCTYPE winl PUBLIC "-//PHONE. COM//DTD WML 1.1//EN"

"hLtp://www.phone.cora/dtd/wmlll.dtd" >

<wml>

<card id="start" ontimer="index.wml">

< Lime i1 value="3"/>

<p align="center"><img scr="logo.wbmp" alt="Wclcomc!"/s <br/><i>

0ne moment ...</i> </p> </card> </wml>

В нашем случае на дисплее мобильного устройства может быть выведен логотип.

Обращаем ваше внимание, что в языке WML, так же, как и в HTML, используется похожий тег <img/>, где в качестве атрибута src включается графический образ, с одной лишь разницей — данный образ имеет формат WBMP (Wireless BMP). Для конвертирования в формат WBML лучше всего выбирать небольшие изображения. Максимальный размер картинки зависит от устройства, но при всем при том не должен превышать 1,4 Кбайт. Впрочем, не следует злоупотреблять графическими. образами из-за небольшого количества памяти и чрезмерно длительного ожидания загрузки файла.

В WML так же, как и во всех языках, реализована концепция переменных. Например, в зависимости от значения той или иной переменной можно изменять и поведение карты. Значения переменным могут быть присвоены как посредством тега <setvar>, так и с использованием элементов ввода <input>, <option>, <select> и др. В следующем примере представлена форма для идентификации пользователя, где предварительно объявляются необходимые переменные:

<card id="BuyTickets" title="Buy Tickets">

<onevent type="onenterforward"> <refresh>

<setvar name="EMail" value="Test@MyMail" />

<setvar name="Password" value="Test" />

<setvar name="Category" value="Adults" />

</refresh> </onevent>

<onevent type="onenterbackward">

<refresh>

<setvar name="EMail" value="" />

<setvar name="Password" value="" />

<setvar name="Category" value="" />

</refresh>

</onevent>

<do -type="prev" label="Home">

<go href="#Init"/></do>

<p align="left" mode="nowrap">

E-Mail: <input type="text" name="EMail"/><br/>

Password: <input type="password" name="Password"/><br/>

Category:

<select naine="Category">

<option value= "Adults ">Adults</option>

<option value="Children">Children</option>

<option value=" Senior s">Seniors< /option>

</select>

<anchor title="go">Submit<go method="post"

href="http: //localhost/MyLineCruises/login. cfm">

</go></anchor>

</p>

</card>

В данном примере представлено содержание одной карты BuyTickets, где пользователю предлагается ввести его электронный адрес, пароль и возрастную категорию. Как видно из примера, применение элементов ввода <input>, <optlon> и <select> схоже с использованием подобных элементов в HTML. В этом же примере было применено отслеживание событий для объявления переменных. Поскольку значения переменных не уничтожаются при переходе от одной карты к другой, их можно исдользовать в различных картах. Это обстоятельство может рассматриваться как преимущество, хотя не всегда. При переходе от карты к карте фактические значения элементов карты могут начать расходиться с ее реальным значением. Во избежание этого разработано несколько событий (тег <onevent>), позволяющих отслеживать так называемый "маршрут", по которому пользователь "дошел" к текущей карте. Для нашего примера тип onenterforward подразумевает событие, происходящее при переходе "вперед", а тип onenterbackward предполагает событие, происходящее при переходе "назад".

Мы ни слова не сказали о WMLScript, только упомянув, что он является аналогом JavaScript. Впрочем, это уже отдельная тема. Скажем только, что WMLScript является процедурным языком и поддерживает локально установленные стандартные библиотеки.

Совместное использование WMLnCFML

Для того чтобы CFML-код в сочетании с WML выполнялся корректно, на первой строке кода CFML-файла необходимо определять МIMЕ-мнемокод для его содержимого следующим образом:

<CFCONTENT TYPE="text/vnd.wap.wml">

Таким образом, для страницы устанавливается MIME-тип WML-документа— text /vnd. wap. wml независимо от расширения файла. В противном случае эмулятор WAP-баузера определит весь последующий код, как HTML, и при его компиляции выдаст ошибку.

Причем в ColdFusion Studio существует шаблон, позволяющий открывать новый документ с уже включенной строкой подобного характера. Выполните команду File | New (Файл | Создать) и в появившемся диалоговом окне New Document (Новый документ) во вкладке WML выберите шаблон Dynamic (using CF) (Динамический). После чего в основном окне редактирования откроется файл со следующим содержанием:

<CFCONTENT TYPE="text/vnd.wap.wml"> <?xml version="1.0"?>

<!DOCTYPE wml PUBLIC "-//PHONE.COM//DTD WML 1.1//EN" "http://www.phone.com/dtd/wmlll.dtd" >

<wml>

<card>

</card> </wml>

Данный шаблон аналогичен шаблону Static (Статический) с одной лишь разницей — в начале кода определен МIMЕ-мнемокод. Что это дает? Предположим, у нас есть документ default.cfm, используемый сервером по умолчанию, и нам необходимо независимо от загружаемого клиента, WAP или Web, предоставлять пользователю информацию в соответствии с его устройством: телефоном или компьютером. Для решения этой задачи сформируем содержание файла default.cfm следующим образом:

<CFIF CGI.HTTP_USER_AGENT contains "wap">

<CFCONTENT TYPE="text/vnd.wap.wml">

<?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"

"http://www.wapforum.org/DTD/wml_l.1.xml"> <wml>

<card id="start" ontimer="index.wml">

<timer value="3"/>

<p align="center"ximg src="logo.wbmp" alt="Welcome!"/> <br/><i>

0ne moment. . . </i> </P> </card> </wml> <CFELSE>

<META HTTP-BQUIV="Refresh" CONTENT="0;URL=index.cfm"> </CFIF>

Как видно из примера, при обнаружении в переменной CGI .HTTP_USER_AGENT фрагмента "wap" выполняется код, написанный на языке WML. В противном случае загружается обычная страница index.cfm, подготовленная для чтения в привычном Web-браузере.

Надо заметить, что файл index.cfm мы несколько изменили, добавив некоторое количество карт, и в качестве первой карты поместили список ссылок на существующие карты, что несколько напоминает вертикальное меню.

Создание диаграммы с помощью тега <CFGRAPH> посредством мобильного устройства

В качестве заключительного примера представим решение следующей задачи. Предположим, что, используя мобильное устройство, нам необходимо на сервере создать CFML-файл, который бы использовался в качестве построителя диаграммы на основе таблицы Tour базы данных Cruise (зависимость цены от предлагаемых туров), с мобильного же устройства мы бы передавали заголовок и тип диаграммы, благо в ColdFusion существует тег <CFGRAPH>, позволяющий строить диаграммы различных типов. В частности данный тег обеспечивает построение следующих диаграмм:

Далее будут представлены две страницы: Graph. cfm, выступающая в качестве диалоговой формы для ввода заголовка и типа будущей диаграммы, и BuildGraph.cfm, позволяющая создать файл CostGraph.cfm с необходимым содержанием.

Листинг 22.1. Код страницы Graph. cfm

version="1.0"?> <!DOCTYPE wml PUBLIC "-//PHONE. COM/ /DTD WML 1.1//EN"

"http: //www.phone.com/dtd/wmlll .dtd" > <wml>

<template>

<do type="prev" name="BACK" label="Back"

optional="false"><prev/></do> </template>

<card id="Graph" title="Data input Graph">

<onevent type="onenterforward"> <refresh>

<setvar name="TitleGraph" value="Cost" />

<setvar name="TypeGraph" value="Bar" /> </refresh> </onevent>

<onevent type="onenterbackward">

<refresh>

<setvar name="TitleGraph" value="" />

<setvar name="TypeGraph" value="" /> </refresh> </onevent>

<do type="Accept" label="Build">

<go href="BuildGraph. cfm?TitleGraph=$(TitleGraph) samp;

TypeGraph=$ (TypeGraph) "/> </do>

<p align="left" mode="nowrap">

TitleGraph:

<input type="text" name="TitleGraph"/><br/> TypeGraph : Object name="TypeGraph">

<option value="Bar">Bar</option>

<option value="Pie">Pie</option>

<option value="Line">Line</option>

<option value="HorizontalBar">HorizontalBar</option>

</select> </p> </card> </wml>

Листинг 22.2. Код страницы BuildGraph.cfm

<CFCONTENT TYPE="text/vnd.wap.wml"> <?xml version="1.0"?>

<!DOCTYPE wml PUBLIC "-//PHONE. COM/ /DTD WML 1.1//EN" "http: //www.phone.com/dtd/wmlll.dtd" >

<wml>

<card id="BuildGraph" title="Build Graph">

<CFSWITCH EXPRESSION=#TypeGraph#>

<CFCASE VALOE="Bar">

<CFSET Graph = '<CFGRAPH TYPE = "Bar" QUERY = "Tour"

VALUECOLUMN = "CostAdult_tou"

ITEMCOLUMN = "Name_tou"

TITLE = "#TitleGraph#"

SCALEFROM = "0" SCALETO = "10"

DEPTH = "10"

BARSPACING = "20" GRIDLINES = "4"

GRAPHHEIGHT = "300" GRAPHWIDTH = "400"

COLORLIST = "####003399, ####ffccOO,####33ccOO,

####990033" ITEMLABELORIENTATION = "Horizontal"

VALUELOCATION = "Overbar"></CFGRAPH> ' > </CFCASE>

<CFCASE VALUE="Pie">

<CFSET Graph = '<CFGRAPH TYPE = "Pie" QUERY = "Tour"

VALUECOLUMN = "CostAdult_tou"

ITEMCOLUMN = "Name_tou" TITLE = "#TitleGraph#"

VALUELOCATION = "Outside" BORDERWIDTH = "0"

GRAPHHEIGHT = "450" GRAPHWIDTH = "550"

DEPTH = "15" COLORLIST = "####003399,

####ffcc00,####33cc00, #§##990033"

SHOWLEGEND = "Right"X/CFGRAPH>' > </CFCASE>

<CFCASE VALUE="Line">

<CFSET Graph = '<CFGRAPH TYPE = "Line"

QUERY = "Tour" VALUECOLUMN = "CostAdult_tou"

ITEMCOLUMN = "Name_tou" SCALEFROM = "0"

SCALETO = "10" TITLE = "#TitleGraph#"

GRAPHHEIGHT = "300" GRAPHWIDTH = "400"

DEPTH ="10" GRIDLINES = "4"></CFGRAPH>'>

</CFCASE> <CFCASE VALUE="HoriZOntalBar">

<CFSET Graph = '<CFGRAPH TYPE = "HorizontalBar"

QUERY = "Tour" VALUECOLUMN = "CostAdult_tou"

ITEMCOLUMN = "Name_tou" VALUELOCATION = "Overbar"

SCALEFROM = "0" SCALETO = "10" TITLE = "#TitleGraph#"

BARSPACING = "20" GRAPHHEIGHT = "300"

GRAPHWIDTH = "400" DEPTH = "10" COLORLIST = "###1003399,####ffcc00,####33cc00,####990033"

GRIDLINES = "4"></CFGRAPH>'> </CFCASE>

<CFDEFAULTCASE>

<!---Default Bar--->

<CFSET Graph = '<CFGRAPH TYPE = "Bar"

QUERY = "Tour" VALUECOLUMN = "CostAdult_tou"

ITEMCOLUMN = "Name_tou" TITLE = "Cost"

SCALEFROM = "0" SCALETO = "10"..DEPTH = "10"

BARSPACING = "20" GRIDLINES = "'4"

GRAPHHEIGHT - "300" GRAPHWIDTH = "400"

COLORLIST = "####003399,####ffccOO,####33ccOO,§###990033" ITEMLABELORIENTATION = "Horizontal"

VALUELOCATION = "Overbar"></CFGRAPH>'></CFDEFAULTCASE> </CFSWITCH>

<CFFILE ACTION = "Write"

FILE = "C:\Apache\htdocs\MyLineCruises\CostGraph.cfm"

OUTPUT = "<CFQUERY NAME='Tour'

DATASOURCE='#application.dsn#'>SELECT Name_tou, CostAdult_tou FROM Tour</CFQUERY> #Graph#">

<p>The diagram <CFOuTPuT>#TitleGraph#</CFOUTPUT> is constructed!</p>

</card> </wml>

Остается только продемонстрировать, как это работает.

После ввода данных, как показано на предыдущих рисунках, следует выбрать пункт Options (Параметры) и в раскрывшемся меню выполнить команду Build (Построить).

Замечание

Для использования тега <CFGRAPH>, как мы убедились, позволяющего строить диаграммы, требуется наличие сервера Java-приложений JRun 3.0 Server, в прошлом как и ColdFusion принадлежавшего компании Allaire, а в настоящий момент являющегося программным продуктом корпорации Macromedia.

Резюме

Подведем итог. В данной главе мы использовали CFML-тег <CFGRAPH>.